package ar.com.ctrln.view.dashboard.ventas.servicio;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.EventQueue;
import org.zkoss.zk.ui.event.EventQueues;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Label;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Row;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Window;

import ar.com.ctrln.control.ventas.servicio.RegistrarContratacionServicio;
import ar.com.ctrln.persistence.model.cliente.Cliente;
import ar.com.ctrln.persistence.model.contratacion.ContratacionServicio;
import ar.com.ctrln.persistence.model.contratacion.DetalleContratacion;
import ar.com.ctrln.persistence.model.contratacion.DetalleContratacionInternet;
import ar.com.ctrln.persistence.model.contratacion.DetalleContratacionTelefonia;
import ar.com.ctrln.persistence.model.servicios.Servicio;
import ar.com.ctrln.persistence.model.servicios.TipoServicio;
import ar.com.ctrln.persistence.model.servicios.telefonia.Operador;
import ar.com.ctrln.view.ui.comportamientoVentana.AbstractMinimizarVentana;

@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class RegistrarContratacionServicioController extends
		AbstractMinimizarVentana {

	private static final long serialVersionUID = -4825064109993868352L;

	@WireVariable
	private RegistrarContratacionServicio registrarContratacion;

	@SuppressWarnings("rawtypes")
	private EventQueue eq;

	@SuppressWarnings("rawtypes")
	private EventQueue seleccionOperador;

	@Wire
	private Window wRegistrarContratacionServicio;

	@Wire
	private Label lClienteSelect;

	@Wire
	private Label lTipoActividad;

	@Wire
	private Label lLocalidad;

	@Wire
	private Label lProvincia;

	@Wire
	private Label lTipoCliente;

	@Wire
	private Row rowTelefonia;

	@Wire
	private Row rowInternet;

	@Wire
	private Combobox cboTipoServicio;

	@Wire
	private Textbox tbABandaSubida;

	@Wire
	private Textbox tbABandaBajada;

	@Wire
	private Textbox tbAbonados;

	@Wire
	private Textbox tbtbBloquesIp;

	@Wire
	private Textbox tbNroDeTramas;

	@Wire
	private Textbox tbClaveOrigen;

	@Wire
	private Combobox cbopProtocolo;

	@Wire
	private Listbox lbOperadores;

	Set<Operador> operadores;

	private Cliente cliente;

	private String seleccion;

	private ContratacionServicio contratacionServicio;

	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);

		operadores = new HashSet<Operador>();

		rowInternet.setVisible(false);
		rowTelefonia.setVisible(false);

		eq = EventQueues.lookup("interactive", EventQueues.DESKTOP, true);
		eq.subscribe(new EventListener() {
			public void onEvent(Event event) throws Exception {
				cliente = (Cliente) event.getData();
				lClienteSelect.setValue(cliente.getRazonSocial());
				lTipoActividad.setValue(cliente.getTipoActividad()
						.getNombreTipoActividad());
				lTipoCliente.setValue(cliente.getTipoOrganizacion()
						.getDescripcion());
				lLocalidad.setValue(cliente.getDireccion().getLocalidad()
						.getNombre());
				lProvincia.setValue(cliente.getDireccion().getLocalidad()
						.getProvincia().getNombre());
			}
		});
		seleccionOperador = EventQueues.lookup("seleccionar_operador",
				EventQueues.DESKTOP, true);
		seleccionOperador.subscribe(new EventListener<Event>() {

			@Override
			public void onEvent(Event event) throws Exception {
				Operador operador = (Operador) event.getData();
				operadores.add(operador);
				lbOperadores.setModel(new ListModelList<Operador>(operadores));
			}
		});
	}

	@Listen("onClick = #btnSelectEmisor")
	public void selectEmisor() {
		Executions.createComponents("/zul/reusables/seleccionarCliente.zul",
				null, null);
	}

	@Listen("onClick = #iAgregarOperador")
	public void selectOperador() {
		Executions.createComponents(
				"/zul/ventas/contratacion/agregarOperador.zul", null, null);
	}

	@Listen("onClick = #iEliminarDetalle")
	public void deleteOperador() {
		Operador operador = lbOperadores.getSelectedItem().getValue();
		operadores.remove(operador);
		lbOperadores.setModel(new ListModelList<Operador>(operadores));

	}

	@Listen("onCreate = #cboTipoServicio")
	public void cargarTipoServicio() {
		cboTipoServicio.setModel(new ListModelList<TipoServicio>(
				registrarContratacion.listaTipoServicio()));
	}

	@Listen("onSelect = #cboTipoServicio")
	public void habilitarContratacion() {
		seleccion = ((TipoServicio) cboTipoServicio.getModel().getElementAt(
				cboTipoServicio.getSelectedIndex())).getNombre();
		String[] s = seleccion.split(" ");
		seleccion = s[0];

		if (seleccion.equals(TipoServicio.TIPO_INTERNET)) {
			rowInternet.setVisible(true);
			rowTelefonia.setVisible(false);
		} else if (seleccion.equals(TipoServicio.TIPO_TELEFONIA)) {
			rowTelefonia.setVisible(true);
			rowInternet.setVisible(false);
		}
	}

	@Listen("onClick = #aceptar")
	public void registrarContratacion() {

		contratacionServicio = new ContratacionServicio();

		contratacionServicio.setCliente(cliente);

		contratacionServicio.setFechaInicio(new Date());

		contratacionServicio.setEstado(ContratacionServicio.ESTADO_EN_PROCESO);

		Set<DetalleContratacion> detalles = new HashSet<DetalleContratacion>();

		TipoServicio tipoServicio = cboTipoServicio.getSelectedItem()
				.getValue();

		contratacionServicio.setTipoServicio(tipoServicio);

		boolean resultado = registrarContratacion
				.guardarNuevaContratacion(contratacionServicio);

		if (seleccion.equals(TipoServicio.TIPO_INTERNET)) {

			for (Servicio servicio : registrarContratacion
					.listaServicios(tipoServicio.getId())) {

				DetalleContratacionInternet detalleInternet = new DetalleContratacionInternet();

				detalleInternet.setContrato(contratacionServicio);

				detalleInternet.setAnchoBandaSubida(Double
						.parseDouble(tbABandaSubida.getText()));
				detalleInternet.setAnchoBandaBajada(Double
						.parseDouble(tbABandaBajada.getText()));
				detalleInternet.setCantidadBloquesIp(Integer
						.parseInt(tbtbBloquesIp.getText()));
				detalleInternet.setCantidadUsuarios(Integer.parseInt(tbAbonados
						.getText()));
				detalleInternet.setServicio(servicio);

				detalleInternet.setProtocoloRouting(cbopProtocolo
						.getSelectedItem().getLabel());

				detalleInternet.setFechaInicio(new Date());

				registrarContratacion.guardarDetalleInternet(detalleInternet);
			}

		} else if (seleccion.equals(TipoServicio.TIPO_TELEFONIA)) {

			for (Servicio servicio : registrarContratacion
					.listaServicios(tipoServicio.getId())) {

				DetalleContratacionTelefonia detalleTelefonia = new DetalleContratacionTelefonia();

				detalleTelefonia.setContrato(contratacionServicio);

				detalleTelefonia.setOperadores(operadores);

				detalleTelefonia.setFechaInicio(new Date());

				detalleTelefonia.setNroTramas(Integer.parseInt(tbNroDeTramas
						.getText()));

				detalleTelefonia.setServicio(servicio);

				detalleTelefonia.setClave(Integer.parseInt(tbClaveOrigen
						.getText()));

				registrarContratacion.guardarDetalleTelefonia(detalleTelefonia);
			}
		}

		if (resultado) {
			Clients.showNotification("Registro Servicio a Cliente completo",
					Clients.NOTIFICATION_TYPE_INFO, null, "middle_center", 2500);
		} else {
			Clients.showNotification("Error en Registro de Servicio a Cliente",
					Clients.NOTIFICATION_TYPE_ERROR, null, "middle_center",
					2500);
		}
		wRegistrarContratacionServicio.onClose();
	}

	@Listen("onClick = #cancelar")
	public void volverConsultar() {

		seleccionOperador.close();
		eq.close();
		wRegistrarContratacionServicio.onClose();
	}

}
